'use strict';

let _ = require('lodash');

module.exports = function (default_sort, default_offset, default_limit, max_limit) {

    /**
     * This will setup the req query params with filtered data and defaults
     *
     * sort    will be an array of fields and their direction
     * offset  will be an int, defaulting to zero if no other default supplied
     * limit   will be an int, defaulting to 50 if no other default supplied, and limited to the max if that was supplied
     *
     */

    return function (req, res, next) {

        req.query.offset = typeof req.query.limit === 'undefined' ? default_offset || 0 : parseInt(req.query.offset, 10);
        req.query.limit  = typeof req.query.limit === 'undefined' ? default_limit || 50 : parseInt(req.query.limit, 10);

        if (max_limit && req.query.limit > max_limit) {
            req.query.limit = max_limit;
        }

        // Sorting
        let sort       = typeof req.query.sort === 'undefined' ? default_sort : req.query.sort;
        let myRegexp   = /.*\.(asc|desc)$/ig;
        let sort_array = [];

        sort = sort.split(',');
        _.map(sort, function (val) {
            let matches = myRegexp.exec(val);

            if (matches !== null) {
                let dir = matches[1];
                sort_array.push({
                    field: val.substr(0, val.length - (dir.length + 1)),
                    dir: dir.toLowerCase()
                });
            } else {
                sort_array.push({
                    field: val,
                    dir: 'asc'
                });
            }
        });

        // Sort will now be in this format:
        // [
        //    { field: 'field1', dir: 'asc' },
        //    { field: 'field2', dir: 'desc' }
        // ]

        req.query.sort = sort_array;
        next();
    };
};
